3a

Widget states — KPI tile and trend line

agent dashboard (1a) executive dashboard (2a)

One rule across all five: the widget frame, title and info control never move between states — only the body changes. Skeletons hold the exact height and column positions of the real figures, so nothing reflows on arrival. Every non-loaded state names the system responsible and offers the one action that resolves it.

1 · Loading
Skeleton at the figure's real size. No spinner, no bouncing.
2 · Loaded
Value, variance against the comparison period, freshness.
3 · Empty
Says why it is empty, then offers the next action.
4 · Partial
Renders what is available, names what is withheld or stale.
5 · Error
Names the failing source and the failure. Retry in place.
Commission revenue
Loading commission revenue
Commission revenue
$214,880
+18.4% vs $181,540 LY
Accounting 03:14 today
Commission revenue
$0
No commissions posted between Jul 1 and Jul 31. Your two July deals close in September.
Commission revenue
$214,880
— · — variance unavailable
Partial 1 of 2 fields shown
Prior-year comparison sits in the payroll-linked ledger, which your role cannot read. Revenue itself is complete.
Request access from your managing broker
Commission revenue
$——,———
Accounting sync failed at 03:02 — the commission journal export returned no rows for August. Last good figure was Aug 16, 03:11.
ERR-ACCT-204
Production by month
Production by month
Closed volume, $M · dashed = prior year
MLS · transaction mgmt 02:52 today
Production by month
Closed volume, $M
Nothing closed in this range. Your MLS feed is connected and current — there simply are no closed deals between Jun 1 and Jul 31.
Production by month
Closed volume, $M · current period only
no data
Partial 9 of 12 months · prior year withheld
MLS last synced 51 h ago, so Jun–Aug are missing. Prior-year overlay needs office-level history your role cannot read.
Production by month
Could not be computed
MLS feed rejected our credentials at 02:52. Close dates arrived from transaction management, but sale prices did not, so monthly volume cannot be totalled.
Transaction mgmtok · 03:07
MLS401 · 02:52
ERR-MLS-401
Stale treatment — source last synced over 36 hours ago
Commission revenue
$214,880
+18.4% as at Aug 15
Stale · 51 h old Re-sync
Accounting last synced Aug 15, 03:09. Two nightly runs missed.
What changes when stale
  • The figure drops from ink to graphite — still legible, no longer authoritative.
  • Variance turns amber rather than green or red, because the direction can no longer be trusted.
  • “vs LY” becomes “as at Aug 15” — the date the number describes, not the date you are reading it.
  • A full-width amber footer replaces the quiet freshness line, with the age in hours and a re-sync action.
  • Layout, height and column positions are unchanged, so a stale widget never shifts the grid.
Scope bar · “Last refreshed” across three conditions
Sep 2025 – Aug 2026 ▾ Compare: YoY ▾ Last refreshed 03:14 today · all 4 sources
Sep 2025 – Aug 2026 ▾ Compare: YoY ▾ 2 sources stale · oldest 51 h · accounting, MLS
Sep 2025 – Aug 2026 ▾ Compare: YoY ▾ MLS sync failed 02:52 · showing Aug 15 · volume & price affected
The indicator never disappears and never lies by omission: it always states a time, and when something is wrong it also states how many sources, which ones, and what data is affected — so nobody in a boardroom reads a 51-hour-old figure as today's.